package comment_api

import (
	"software/global"
	"software/models"
	"software/models/Response"
	"software/models/res"
	"software/service"
	"strconv"

	"github.com/gin-gonic/gin"
	"go.mongodb.org/mongo-driver/bson/primitive"
)

// CommentListRequest 评论列表请求
type CommentListRequest struct {
	PostID   string `form:"post_id"`              // 帖子ID，不再是必填项
	Page     int    `form:"page,default=1"`       // 页码，默认1
	PageSize int    `form:"page_size,default=10"` // 每页数量，默认10
	Status   int8   `form:"status,default=-1"`    // 状态，默认-1表示不过滤
	Keyword  string `form:"keyword"`              // 关键词
}

// GetCommentList 获取评论列表
func (p CommentApi) GetCommentList(c *gin.Context) {
	var req CommentListRequest

	// 绑定请求参数
	if err := c.ShouldBindQuery(&req); err != nil {
		res.FailWithMsg("参数错误: "+err.Error(), c)
		return
	}

	// 限制页面大小
	if req.PageSize <= 0 {
		req.PageSize = 10
	} else if req.PageSize > 50 {
		req.PageSize = 50
	}

	// 确保页码有效
	if req.Page <= 0 {
		req.Page = 1
	}

	var commentList interface{}
	var err error

	// 根据是否提供帖子ID决定查询逻辑
	if req.PostID != "" {
		// 将帖子ID转换为ObjectID
		postID, err := primitive.ObjectIDFromHex(req.PostID)
		if err != nil {
			res.FailWithMsg("无效的帖子ID格式", c)
			return
		}

		// 调用服务获取指定帖子的评论列表
		commentList, err = service.GetCommentList(c, postID, req.Page, req.PageSize, req.Status, req.Keyword)
		if err != nil {
			res.FailWithMsg("获取评论列表失败: "+err.Error(), c)
			return
		}
	} else {
		// 调用服务获取全部评论列表
		commentList, err = service.GetAllCommentsPaginated(c, req.Page, req.PageSize, req.Status, req.Keyword)
		if err != nil {
			res.FailWithMsg("获取评论列表失败: "+err.Error(), c)
			return
		}
	}

	// 返回成功响应
	res.OKWithData(commentList, c)
}

// GetCommentDetail 获取评论详情
func (p CommentApi) GetCommentDetail(c *gin.Context) {
	// 获取评论ID
	commentIDStr := c.Param("id")

	// 将ID转换为ObjectID
	commentID, err := primitive.ObjectIDFromHex(commentIDStr)
	if err != nil {
		res.FailWithMsg("无效的评论ID格式", c)
		return
	}

	// 调用服务获取评论详情
	comment, err := service.GetCommentByID(c, commentID)
	if err != nil {
		res.FailWithMsg("获取评论详情失败: "+err.Error(), c)
		return
	}

	// 查询用户信息
	var user *models.User
	if err := global.DB.Where("id = ?", comment.UserID).First(&user).Error; err != nil {
		global.Log.Warnf("查询用户信息失败: %v，将使用默认用户信息", err)
		// 如果找不到用户信息，创建一个默认用户
		user = &models.User{
			ID:       comment.UserID,
			Nickname: "未知用户",
			Avatar:   "",
		}
	}

	// 构建评论响应
	commentResponse := Response.BuildCommentResponse(comment, user)

	// 返回成功响应
	res.OKWithData(commentResponse, c)
}

// GetUserComments 获取用户的评论
func (p CommentApi) GetUserComments(c *gin.Context) {
	// 获取用户ID
	userIDStr := c.Param("user_id")
	userID, err := strconv.ParseUint(userIDStr, 10, 64)
	if err != nil {
		res.FailWithMsg("无效的用户ID格式", c)
		return
	}

	// 调用服务获取用户的评论
	comments, err := service.GetCommentsByUserID(c, userID)
	if err != nil {
		res.FailWithMsg("获取用户评论失败: "+err.Error(), c)
		return
	}

	// 如果没有评论，返回空数组
	if len(comments) == 0 {
		res.OKWithData([]interface{}{}, c)
		return
	}

	// 查询用户信息
	var user *models.User
	if err := global.DB.Where("id = ?", userID).First(&user).Error; err != nil {
		global.Log.Warnf("查询用户信息失败: %v，将使用默认用户信息", err)
		// 如果找不到用户信息，创建一个默认用户
		user = &models.User{
			ID:       userID,
			Nickname: "未知用户",
			Avatar:   "",
		}
	}

	// 构建评论响应列表
	var commentResponses []Response.CommentResponse
	for i := range comments {
		commentResponses = append(commentResponses, Response.BuildCommentResponse(&comments[i], user))
	}

	// 返回成功响应
	res.OKWithData(commentResponses, c)
}

// GetAllComments 获取所有评论（管理员使用）
func (p CommentApi) GetAllComments(c *gin.Context) {
	// 检查是否为管理员
	// TODO: 添加管理员权限检查逻辑

	// 获取分页参数
	var req struct {
		Page     int    `form:"page,default=1"`       // 页码，默认1
		PageSize int    `form:"page_size,default=10"` // 每页数量，默认10
		Status   int8   `form:"status,default=-1"`    // 状态，默认-1表示不过滤
		Keyword  string `form:"keyword"`              // 关键词
	}

	// 绑定请求参数
	if err := c.ShouldBindQuery(&req); err != nil {
		res.FailWithMsg("参数错误: "+err.Error(), c)
		return
	}

	// 限制页面大小
	if req.PageSize <= 0 {
		req.PageSize = 10
	} else if req.PageSize > 50 {
		req.PageSize = 50
	}

	// 确保页码有效
	if req.Page <= 0 {
		req.Page = 1
	}

	// 调用服务获取所有评论（分页）
	commentList, err := service.GetAllCommentsPaginated(c, req.Page, req.PageSize, req.Status, req.Keyword)
	if err != nil {
		res.FailWithMsg("获取所有评论失败: "+err.Error(), c)
		return
	}

	// 返回成功响应
	res.OKWithData(commentList, c)
}

// GetLatestComments 获取最新评论
func (p CommentApi) GetLatestComments(c *gin.Context) {

	// 调用服务获取最新评论
	comments, err := service.GetLatestCommentsWithoutPagination(c, 5)
	if err != nil {
		res.FailWithMsg("获取最新评论失败: "+err.Error(), c)
		return
	}

	// 返回成功响应
	res.OKWithData(comments, c)
}
